package com.hxzy.shop.commodity.listener;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hxzy.shop.commodity.dto.req.BatchEditDrugReq;
import com.hxzy.shop.commodity.dto.resp.ClassifiedManagementResp;
import com.hxzy.shop.commodity.dto.resp.DrugImportExcelResp;
import com.hxzy.shop.commodity.service.ClassifiedManagementService;
import com.hxzy.shop.commodity.service.DrugService;
import com.hxzy.shop.constant.AuthConstant;
import com.hxzy.shop.entity.ClassifiedManagement;
import com.hxzy.shop.entity.Drug;
import com.hxzy.shop.entity.MarketingActivityTable;
import com.hxzy.shop.utils.WebUtil;
import com.hxzy.shop.vo.ApiException;
import lombok.Data;
import lombok.extern.java.Log;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @Description
 * @Author tu-jia-hao
 * @Data 2022/8/15 10:40
 */
@Data
@Log
public class ExcelBatchEditDrugListener extends AnalysisEventListener<BatchEditDrugReq> {

    //原始数据
    private List<BatchEditDrugReq> batchEditDrugReqList;

    //可以修改的数据
    private List<BatchEditDrugReq> successList;
    //有问题的数据
    private List<BatchEditDrugReq> failedList;

    //最大条数
    private static Integer SIZE = 1000;

    private ClassifiedManagementService classifiedService;
    private DrugService drugService;

//    //消息队列
//    private DrugProducer drugProduces;


//    public ExcelBatchEditDrugListener() {
//        batchEditDrugReqList = new ArrayList<>();
//        successList = new ArrayList<>();
//        failedList = new ArrayList<>();
//    }

//    public ExcelBatchEditDrugListener(ClassifiedManagementService classifiedService, DrugService drugService) {
//        batchEditDrugReqList = new ArrayList<>();
//        successList = new ArrayList<>();
//        failedList = new ArrayList<>();
//        this.classifiedService = classifiedService;
//        this.drugService = drugService;
//    }
//    public ExcelBatchEditDrugListener(ClassifiedManagementService classifiedService, DrugService drugService,DrugProducer drugProduces) {
//        batchEditDrugReqList = new ArrayList<>();
//        successList = new ArrayList<>();
//        failedList = new ArrayList<>();
//        this.classifiedService = classifiedService;
//        this.drugService = drugService;
//        this.drugProduces = drugProduces;
//    }

    @Override
    public void invoke(BatchEditDrugReq data, AnalysisContext context) {
        batchEditDrugReqList.add(data);
        if (batchEditDrugReqList.size() >= SIZE + 1) {
            throw new ApiException(500, "一次性导入数量不得超过" + SIZE + "条");
        }
    }

//    private void save(){
//        List<String> barcodeList = batchEditDrugReqList.stream().map(e -> e.getBarCode()).collect(Collectors.toList());
//        List<Drug> drugList = drugService.list(new QueryWrapper<Drug>().lambda().eq(Drug::getDisable,Boolean.FALSE)
//                .in(Drug::getBarCode, barcodeList));
//        Map<String, Drug> drugMap = drugList.stream().collect(Collectors.toMap(Drug::getBarCode, Function.identity(), (k1, k2) -> k2));
//
//        //药品分类
//        List<ClassifiedManagementResp> classifiedList = classifiedService.getClassifiedList();
//
//        //获得商户id
//        HttpServletRequest request = WebUtil.getRequest();
//        String merchantId = request.getHeader(AuthConstant.MERCHANT_ID);
//        for (BatchEditDrugReq d:batchEditDrugReqList
//             ) {
//            d.setMerchantId(merchantId);
//            String barCode = d.getBarCode();
//            Drug drug = drugMap.get(barCode);
//            if(ObjectUtil.isEmpty(drug)){
//                d.setErrMessage("该条码药品不存在 或条码为空");
//                failedList.add(d);
//                continue;
//            }else {
//                d.setDrugId(drug.getId().toString());
//            }
//            //判断分类是否存在
//            //判断药品分类标签是否存在
//
//            if(ObjectUtil.isNotEmpty(d.getStairClassifiedName())) {
//                boolean isExist = false;
//                for (ClassifiedManagementResp classifiedManagementResp : classifiedList) {
//                    if (classifiedManagementResp.getClassificationName().equals(d.getStairClassifiedName())) {
//                        //1级存在 判断2级
//                        for (ClassifiedManagementResp.SubClassified subClassified : classifiedManagementResp.getSubClassified()) {
//                            if (subClassified.getName().equals(d.getSecondLevelClassifiedName())) {
//                                //证明2級标签存在
//                                isExist = true;
//                                d.setStairClassifiedId(classifiedManagementResp.getId().toString());
//                                d.setSecondLevelClassifiedId(subClassified.getId().toString());
//                            }
//                        }
//                    }
//                }
//                if (!isExist) {
//                    d.setErrMessage("药品分类不存在");
//                    failedList.add(d);
//                    continue;
//                }
//            }
//
//
//
//            //判断 处方药标签  状态标签是否合格
//            if(ObjectUtil.isNotEmpty(d.getState())){
//                boolean b = drugService.checkDrugState(drug);
//                if(!b){
//                    d.setErrMessage("该药品状态无法修改");
//                    failedList.add(d);
//                    continue;
//                }
//                if(!d.getState().equals("1") && !d.getState().equals("0")){
//                    d.setErrMessage("药品信息错误");
//                    failedList.add(d);
//                    continue;
//                }
//            }
//            if(ObjectUtil.isNotEmpty(d.getPrescriptionDrug())){
//                if(!d.getPrescriptionDrug().equals("1") && !d.getPrescriptionDrug().equals("0")){
//                    d.setErrMessage("药品信息错误");
//                    failedList.add(d);
//                    continue;
//                }
//            }
//
//            //判断若输入价格 价格是否合规
//            try {
//                if(ObjectUtil.isNotEmpty(d.getUniformRetailPrice())) {
//                    BigDecimal bigDecimal = new BigDecimal(d.getUniformRetailPrice());
//                    if(bigDecimal.compareTo(BigDecimal.ZERO)==-1){
//                        d.setErrMessage("药品价格设置错误");
//                        failedList.add(d);
//                        continue;
//                    }
//                }
//                if(ObjectUtil.isNotEmpty(d.getCostPrice())) {
//                    BigDecimal bigDecimal = new BigDecimal(d.getCostPrice());
//                    if(bigDecimal.compareTo(BigDecimal.ZERO)==-1){
//                        d.setErrMessage("药品价格设置错误");
//                        failedList.add(d);
//                        continue;
//                    }
//                }
//                successList.add(d);
//            }catch (Exception e){
//                d.setErrMessage("药品价格设置错误");
//                failedList.add(d);
//                continue;
//            }
//            if (successList.size() > 0 && successList.size() % 100 == 0) {
//                //每100条发送一次mq执行操作
//                List<BatchEditDrugReq> batchEditDrugReqs = successList.subList(successList.size() - 100, successList.size());
//                //发送mq
//                drugProduces.senddrugEditImportOutputMsg(batchEditDrugReqs);
//            }
//        }
//        //处理未满100条的数据
//        if(ObjectUtil.isNotEmpty(successList) && successList.size() % 100==0){
//              return;
//        }else if(ObjectUtil.isNotEmpty(successList)){
//            int i = successList.size() % 100;
//            List<BatchEditDrugReq> batchEditDrugReqs = successList.subList(successList.size() - i, successList.size());
//            drugProduces.senddrugEditImportOutputMsg(batchEditDrugReqs);
//            //发送mq
//        }
//    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        log.info("开始转换");
//        save();
        log.info(successList+"有效数据");
        log.info(failedList+"无效数据");
        log.info(batchEditDrugReqList+"总数据");
        log.info("转换结束");
    }
}
